package cn.itsource.ymcc.service.impl;

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import cn.itsource.ymcc.constant.Constants;
import cn.itsource.ymcc.result.JsonResult;
import cn.itsource.ymcc.service.IVerifyService;
import cn.itsource.ymcc.util.AssertUtil;
import cn.itsource.ymcc.util.VerifyCodeUtils;
import cn.itsource.ymcc.vo.RegisterSmsVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.validation.constraints.NotNull;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyServiceImpl implements IVerifyService {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;


    @Override
    public JsonResult verifyCode(String imageCodeKey) {
        //有4个参数   长、宽、验证码字符数、干扰线宽度
        ShearCaptcha shearCaptcha = CaptchaUtil.createShearCaptcha(300, 100, 4, 4);
        //第一步 生成 验证码
        String code = shearCaptcha.getCode();
        //第二步 保存redis  验证码的结果   过期时间 5分钟
        redisTemplate.opsForValue().set(imageCodeKey,code,5, TimeUnit.MINUTES);
        //第三步 生成base64格式
        String imageBase64 = shearCaptcha.getImageBase64();
        //最后返回数据给前端
        return JsonResult.success().setData(imageBase64);
    }

    @Override
    public JsonResult sendSmsCode(RegisterSmsVo registerSmsVo) {
        //核心业务
        //1判断图片验证码是否过期
        String imageCodeKey = registerSmsVo.getImageCodeKey();
        //作用 就是去判断 在redis中 当前这个key是否存在
        AssertUtil.isTrue(redisTemplate.hasKey(imageCodeKey),"图片验证码已过期");
        //2判断图片验证码是否输入正确
        String code = redisTemplate.opsForValue().get(imageCodeKey).toString();
        //equalsIgnoreCase 不区分大小写比较
        AssertUtil.isTrue(code.equalsIgnoreCase(registerSmsVo.getImageCode()),"图片验证码不正确");

        //3生产手机验证验证码
        String newSmsCode = VerifyCodeUtils.generateVerifyCode(6);
        String smsKey =  Constants.REGISTER_PHONE + registerSmsVo.getMobile();

        // 1分钟之内  不让重发
        // 3分钟之内  发送同一个

        //在设置redis 我先判断  前面 有没有设置 redis
        if(redisTemplate.hasKey(smsKey)){
            Long expire = redisTemplate.getExpire(smsKey, TimeUnit.SECONDS);//获取的是当前key的剩余时间
            //180
            if(expire > 120){
                return JsonResult.error("你太快了");
            }
            if(expire > 0){
                String lastCode = redisTemplate.opsForValue().get(smsKey).toString();
                System.out.println(lastCode);//调用工具类 发送短信验证码  上一次的
                newSmsCode = lastCode;
            }
        }
        //保存redis  注册
        redisTemplate.opsForValue().set(smsKey,newSmsCode,3,TimeUnit.MINUTES);
        System.out.println(newSmsCode);//调用工具类 发送短信验证码

        return JsonResult.success();
    }
}
